/** ***********************************************************************************
* @file         start_app.c.
* @brief        整个程序主入口函数
* @details      BSP初始化、驱动初始化、创建第一个任务、
* @author       杨小珛
* @date         2020.1.22
* @copyright    北京高知科技有限公司
* @version      V1.0
* @attention    <h2><center>&copy; COPYRIGHT(c) 2014 www.gaozhi.com</center></h2>
**************************************************************************************/

#define OSI_LOG_TAG OSI_MAKE_LOG_TAG('M', 'Y', 'A', 'P')

#include "os_app.h"
#include "net_task.h"
#include "log_task.h"
#include "net_port.h"
#include "mon_task.h"
#include "gnss_task.h"
#include "rtc_task.h"
#include "power_task.h"
#include "event_task.h"
#include "port_task.h"
#include "mcu_task.h"
#include "usb_task.h"
#if (GNSS_QXWZ==1)
#include "qxwz_service.h"
#endif
#include "flash_buffer.h"
#include "save_task.h"
#include "ble_task.h"
#include "battery_task.h"
#include "gsen_task.h"

#include "vehicle_data_process.h"
#include "national_data_process.h"
#include "unit_test.h"
#include "n808_app.h"
#include "bluetooth_app.h"

#define SYS_UNIT_TEST  0  /*配置系统单元测试功能接口*/
#define SYS_PRI_PARA 1      /*打印系统参数*/

#if( SYS_PRI_PARA  == 1 ) 
static void system_print_parameters(void);
#endif
static void start_app_task(void *param);
static void system_app_service_task( void );
static void system_basic_service_task( void );

/** **************************************************************************
* @brief 初始化系统空间参数
* @remarks static void start_app_task(void *param)
* @param[in]  无
* @param[out]  无
* @return  无
* @attention 无
***************************************************************************/
static void prvInvokeGlobalCtors(void)
{
  extern void (*__init_array_start[])();
  extern void (*__init_array_end[])();
  size_t count = __init_array_end - __init_array_start;
  for (size_t i = 0; i < count; ++i)
  {
    __init_array_start[i]();
  }
}

/** ****************************************************************************
* @remarks       static void system_hardware_init( void )
* @brief         系统底层硬件初始化
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/
static void system_hardware_init( void )
{
     save_data_bbt_tables_init();                       /*外部flash 内存初始*/   
}

/** ****************************************************************************
* @remarks       static void system_basic_service_task( void )
* @brief         创建系统基础服务层任务
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/

static void system_basic_service_task( void )
{   
    mon_create_task( OSI_PRIORITY_HIGH );          /*创建系统监控管理基础服务任务*/
    
    power_man_create_task(OSI_PRIORITY_NORMAL);   /*创建系统电源管理基础服务任务*/
    
    rtc_create_task( OSI_PRIORITY_LOW );           /*创建系统RTC管理基础服务任务*/
    
    log_create_task( OSI_PRIORITY_LOW );           /*创建系统日志管理基础服务任务*/
    
    mcu_create_task( OSI_PRIORITY_NORMAL );       /*创建MCU基础数据处理服务任务*/

	save_data_create_task( OSI_PRIORITY_NORMAL ); /*创建数据存储基础服务任务*/
    
    net_port_create_task( OSI_PRIORITY_NORMAL );  /*创建网络接口管理基础服务任务*/
    
    net_data_create_task( OSI_PRIORITY_NORMAL );  /*创建网络数据管理基础服务任务*/
    
    gnss_data_create_task( OSI_PRIORITY_NORMAL ); /*创建GNSS数据管理基础服务任务*/
    
    event_create_task( OSI_PRIORITY_NORMAL );     /*创建EVENT事件处理基础服务任务*/
    
    port_create_task( OSI_PRIORITY_NORMAL );      /*创建PORT事件处理基础服务任务*/
    
    ble_create_task( OSI_PRIORITY_NORMAL );          /*创建BLE数据基础服务任务*/

	battery_man_create_task( OSI_PRIORITY_NORMAL );  /*创建系统备用电池管理任务*/
	  
    gsen_create_task( OSI_PRIORITY_NORMAL );         /*创建GSEN数据处理服务任务,任务设置为最高优先级内部任务的及时性比较强。*/

	usb_create_task( OSI_PRIORITY_LOW );                /*创建USB基层数据处理服务任务*/

    lbs_wifiscan_man_create_task( OSI_PRIORITY_NORMAL );    /*创建LBS WIFISCAN 辅助定位数据处理任务*/
}
/** ****************************************************************************
* @remarks       static void system_app_service_task( void )
* @brief         创建系统应用服务层任务
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/
static void system_app_service_task( void )
{ 
    vehicle_create_task( OSI_PRIORITY_NORMAL );             /*创建车机基础数据处理服务任务*/
    #if( SYS_UNIT_TEST == 1 )
    unit_test_create_task( OSI_PRIORITY_LOW );              /*创建单元接口测试处理服务任务*/
    #endif
    national_808_create_task( OSI_PRIORITY_NORMAL );        /* 808协议 */

    bluetooth_ctl_create_task( OSI_PRIORITY_NORMAL );       /* 蓝牙控制部分 */
}

/** ****************************************************************************
* @remarks       static void system_print_parameters(void)
* @brief         打印系统参数
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/
#if( SYS_PRI_PARA  == 1 ) 
static void system_print_parameters(void)
{
  log_debug_printf(INFOR_MODE,"SYS_START","/*********************************************************************************************/\r\n");
  log_debug_printf(INFOR_MODE,"SYS_START","/*           Beijing Gaozhi Technology Co., LTD   Terminal R&D Department                    */\r\n");
  log_debug_printf(INFOR_MODE,"SYS_START","/*                                                                                             \r\n");
  log_debug_printf(INFOR_MODE,"SYS_START","/*URL     : https://www.gaozhi.com\r\n");
  log_debug_printf(INFOR_MODE,"SYS_START","/*SOFTV   : %s\r\n",OS_SOFTWARE_VERSION );
  log_debug_printf(INFOR_MODE,"SYS_START","/*HARDV   : %s\r\n",OS_HARDWARE_MODEL );
  log_debug_printf(INFOR_MODE,"SYS_START","/*TSP     : %s,%05d\r\n","800b.zykuaiche.com" , 40000 );
  log_debug_printf(INFOR_MODE,"SYS_START","/*********************************************************************************************/\r\n");
}
#endif

/** ****************************************************************************
* @remarks       static void start_app_task(void *param)
* @brief         创建系统头任务
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/
static void start_app_task(void *param)
{
    ( void ) param;
#if( SYS_PRI_PARA  == 1 )  
    system_print_parameters();          /*打印系统启动参数*/
#endif
    system_hardware_init();             /*底层硬件初始化*/
    
    system_basic_service_task();        /*创建系统基础层服务任务*/
    
    system_app_service_task();          /*创建系统应用层服务任务*/
    for( ;; )
    {
        gaoz_task_sleep(3600*1000);
    }
}

/** ****************************************************************************
* @remarks       static FIBO_CALLBACK_T user_callback
* @brief         系统用户空间回调函数接口
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/
static FIBO_CALLBACK_T user_callback = 
{    
    .at_resp = net_at_res_callback,
    .fibo_signal = net_sig_res_callback,
};

/** ****************************************************************************
* @remarks       void * appimg_enter(void *param)
* @brief         系统主入口函数
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/
void * appimg_enter(void *param)
{
    prvInvokeGlobalCtors(); /*系统内部功能函数*/
    /*初始化系统动态分配内存*/
    gaoz_mem_space_init();
    /*底层硬件初始化*/
    
    /*创建系统启动任务*/ 
    gaoz_thread_create(start_app_task, "start_app", 1024*4, NULL, OSI_PRIORITY_NORMAL);
    
    return (void *)&user_callback;
}

/** ****************************************************************************
* @remarks       void appimg_exit(void)
* @brief         系统退出任务
* @param[in]     无
* @param[out]    无
* @return        无
* @attention
*******************************************************************************/

void appimg_exit(void)
{
    OSI_LOGI(0, "application image exit");
}

